μ΅μ νλ λ λλ§ μ±λ₯μ μν WebGL μ °μ΄λ νλ‘κ·Έλ¨ λ§ν¬ λ° λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬ κΈ°μ μ λν μ¬μΈ΅ λΆμ.
WebGL μ °μ΄λ νλ‘κ·Έλ¨ λ§ν¬: λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬
WebGLμ λ λλ§ μμ μ μννκΈ° μν΄ μ °μ΄λμ ν¬κ² μμ‘΄ν©λλ€. μ °μ΄λ νλ‘κ·Έλ¨μ΄ μ΄λ»κ² μμ±λκ³ λ§ν¬λλμ§ μ΄ν΄νλ κ²μ μ±λ₯μ μ΅μ ννκ³ λ³΅μ‘ν μκ° ν¨κ³Όλ₯Ό λ§λλ λ° λ§€μ° μ€μν©λλ€. μ΄ κΈμμλ WebGL μ °μ΄λ νλ‘κ·Έλ¨ λ§ν¬μ 볡μ‘μ±μ νꡬνλ©°, νΉν μ °μ΄λ νλ‘κ·Έλ¨ κ°μ ν¨μ¨μ μΌλ‘ μ ννλ κΈ°λ²μΈ λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬μ μ€μ μ λ‘λλ€.
WebGL λ λλ§ νμ΄νλΌμΈ μ΄ν΄νκΈ°
μ °μ΄λ νλ‘κ·Έλ¨ λ§ν¬μ λν΄ μμ보기 μ μ, κΈ°λ³Έμ μΈ WebGL λ λλ§ νμ΄νλΌμΈμ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. νμ΄νλΌμΈμ κ°λ μ μΌλ‘ λ€μκ³Ό κ°μ λ¨κ³λ‘ λλ μ μμ΅λλ€:
- μ μ μ²λ¦¬(Vertex Processing): λ²ν μ€ μ °μ΄λλ 3D λͺ¨λΈμ κ° μ μ μ μ²λ¦¬νμ¬ μμΉλ₯Ό λ³ννκ³ λ€λ₯Έ μ μ μμ±μ μμ ν μ μμ΅λλ€.
- λμ€ν°ν(Rasterization): μ΄ λ¨κ³μμλ μ²λ¦¬λ μ μ μ νλκ·Έλ¨ΌνΈ(νλ©΄μ κ·Έλ €μ§ μ μ¬μ ν½μ )λ‘ λ³νν©λλ€.
- νλκ·Έλ¨ΌνΈ μ²λ¦¬(Fragment Processing): νλκ·Έλ¨ΌνΈ μ °μ΄λλ κ° νλκ·Έλ¨ΌνΈμ μμμ κ²°μ ν©λλ€. μ‘°λͺ , ν μ€μ²λ§ λ° κΈ°ν μκ° ν¨κ³Όκ° μ μ©λλ κ³³μ λλ€.
- νλ μλ²νΌ μ°μ°(Framebuffer Operations): λ§μ§λ§ λ¨κ³μμλ νλκ·Έλ¨ΌνΈ μμμ νλ μλ²νΌμ κΈ°μ‘΄ λ΄μ©κ³Ό κ²°ν©νμ¬ λΈλ λ© λ° κΈ°ν μ°μ°μ μ μ©ν΄ μ΅μ’ μ΄λ―Έμ§λ₯Ό μμ±ν©λλ€.
GLSL(OpenGL Shading Language)λ‘ μμ±λ μ °μ΄λλ μ μ λ° νλκ·Έλ¨ΌνΈ μ²λ¦¬ λ¨κ³μ λ‘μ§μ μ μν©λλ€. μ΄ μ °μ΄λλ€μ μ»΄νμΌλκ³ μ °μ΄λ νλ‘κ·Έλ¨μΌλ‘ λ§ν¬λμ΄ GPUμμ μ€νλ©λλ€.
μ °μ΄λ μμ± λ° μ»΄νμΌ
μ °μ΄λ νλ‘κ·Έλ¨μ λ§λλ 첫 λ¨κ³λ GLSLλ‘ μ °μ΄λ μ½λλ₯Ό μμ±νλ κ²μ λλ€. λ€μμ κ°λ¨ν λ²ν μ€ μ °μ΄λμ μμ λλ€:
#version 300 es
in vec4 a_position;
uniform mat4 u_modelViewProjectionMatrix;
void main() {
gl_Position = u_modelViewProjectionMatrix * a_position;
}
κ·Έλ¦¬κ³ μ΄μ ν΄λΉνλ νλκ·Έλ¨ΌνΈ μ °μ΄λμ λλ€:
#version 300 es
precision highp float;
out vec4 fragColor;
void main() {
fragColor = vec4(1.0, 0.0, 0.0, 1.0); // Red
}
μ΄ μ °μ΄λλ€μ GPUκ° μ΄ν΄ν μ μλ νμμΌλ‘ μ»΄νμΌλμ΄μΌ ν©λλ€. WebGL APIλ μ °μ΄λλ₯Ό μμ±, μ»΄νμΌ, λ§ν¬νλ ν¨μλ₯Ό μ 곡ν©λλ€.
function createShader(gl, type, source) {
const shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
console.error('An error occurred compiling the shaders: ' + gl.getShaderInfoLog(shader));
gl.deleteShader(shader);
return null;
}
return shader;
}
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
μ °μ΄λ νλ‘κ·Έλ¨ λ§ν¬νκΈ°
μ °μ΄λκ° μ»΄νμΌλλ©΄, μ °μ΄λ νλ‘κ·Έλ¨μΌλ‘ λ§ν¬λμ΄μΌ ν©λλ€. μ΄ κ³Όμ μ μ»΄νμΌλ μ °μ΄λλ€μ κ²°ν©νκ³ κ·Έλ€ μ¬μ΄μ μμ‘΄μ±μ ν΄κ²°ν©λλ€. λ§ν¬ κ³Όμ μμλ μ λνΌ λ³μμ μ΄νΈλ¦¬λ·°νΈμ μμΉλ₯Ό ν λΉνκΈ°λ ν©λλ€.
function createProgram(gl, vertexShader, fragmentShader) {
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
console.error('Unable to initialize the shader program: ' + gl.getProgramInfoLog(program));
return null;
}
return program;
}
const shaderProgram = createProgram(gl, vertexShader, fragmentShader);
μ °μ΄λ νλ‘κ·Έλ¨μ΄ λ§ν¬λ νμλ WebGLμ ν΄λΉ νλ‘κ·Έλ¨μ μ¬μ©νλλ‘ μλ €μΌ ν©λλ€:
gl.useProgram(shaderProgram);
κ·Έλ° λ€μ μ λνΌ λ³μμ μ΄νΈλ¦¬λ·°νΈλ₯Ό μ€μ ν μ μμ΅λλ€:
const uModelViewProjectionMatrixLocation = gl.getUniformLocation(shaderProgram, 'u_modelViewProjectionMatrix');
const aPositionLocation = gl.getAttribLocation(shaderProgram, 'a_position');
ν¨μ¨μ μΈ μ °μ΄λ νλ‘κ·Έλ¨ κ΄λ¦¬μ μ€μμ±
μ
°μ΄λ νλ‘κ·Έλ¨ κ°μ μ νμ λΉκ΅μ λΉμ©μ΄ λ§μ΄ λλ μμ
μΌ μ μμ΅λλ€. gl.useProgram()μ νΈμΆν λλ§λ€ GPUλ μλ‘μ΄ μ
°μ΄λ νλ‘κ·Έλ¨μ μ¬μ©νκΈ° μν΄ νμ΄νλΌμΈμ μ¬κ΅¬μ±ν΄μΌ ν©λλ€. μ΄λ νΉν λ€μν μ¬μ§μ΄λ μκ° ν¨κ³Όκ° λ§μ μ₯λ©΄μμ μ±λ₯ λ³λͺ© νμμ μ λ°ν μ μμ΅λλ€.
κ°κ° κ³ μ ν μ¬μ§(μ: μ², κΈμ, νΌλΆ)μ κ°μ§ λ€μν μΊλ¦ν° λͺ¨λΈμ΄ μλ κ²μμ μκ°ν΄ 보μΈμ. κ° μ¬μ§μ λ³λμ μ °μ΄λ νλ‘κ·Έλ¨μ΄ νμν κ²½μ°, μ΄λ€ νλ‘κ·Έλ¨ κ°μ μμ£Ό μ ννλ©΄ νλ μ μλμ μλΉν μν₯μ λ―ΈμΉ μ μμ΅λλ€. λ§μ°¬κ°μ§λ‘, λ€μν λ°μ΄ν°μ μ΄ κ°κΈ° λ€λ₯Έ μκ°μ μ€νμΌλ‘ λ λλ§λλ λ°μ΄ν° μκ°ν μ ν리μΌμ΄μ μμλ μ °μ΄λ μ νμ μ±λ₯ λΉμ©μ νΉν 볡μ‘ν λ°μ΄ν°μ κ³Ό κ³ ν΄μλ λμ€νλ μ΄μμ λμ λκ² λ μ μμ΅λλ€. μ±λ₯ μ’μ WebGL μ ν리μΌμ΄μ μ ν΅μ¬μ μ’ μ’ μ °μ΄λ νλ‘κ·Έλ¨μ ν¨μ¨μ μΌλ‘ κ΄λ¦¬νλ λ° μμ΅λλ€.
λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬: μ΅μ νλ₯Ό μν μ λ΅
λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬λ μ¬λ¬ μ °μ΄λ λ³νμ λ¨μΌ 'μ°λ² μ °μ΄λ(uber-shader)' νλ‘κ·Έλ¨μΌλ‘ κ²°ν©νμ¬ μ °μ΄λ νλ‘κ·Έλ¨ μ ν νμλ₯Ό μ€μ΄λ κ²μ λͺ©νλ‘ νλ κΈ°λ²μ λλ€. μ΄ μ°λ² μ °μ΄λλ λ€μν λ λλ§ μλ리μ€μ νμν λͺ¨λ λ‘μ§μ ν¬ν¨νκ³ μμΌλ©°, μ λνΌ λ³μλ₯Ό μ¬μ©νμ¬ μ °μ΄λμ μ΄λ€ λΆλΆμ΄ νμ±νλ μ§ μ μ΄ν©λλ€. μ΄ κΈ°λ²μ κ°λ ₯νμ§λ§ μ±λ₯ μ νλ₯Ό νΌνκΈ° μν΄ μ μ€νκ² κ΅¬νν΄μΌ ν©λλ€.
λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬μ μλ λ°©μ
κΈ°λ³Έμ μΈ μμ΄λμ΄λ μ¬λ¬ κ°μ§ λ€λ₯Έ λ λλ§ λͺ¨λλ₯Ό μ²λ¦¬ν μ μλ μ
°μ΄λ νλ‘κ·Έλ¨μ λ§λλ κ²μ
λλ€. μ΄λ 쑰건문(μ: if, else)κ³Ό μ λνΌ λ³μλ₯Ό μ¬μ©νμ¬ μ΄λ€ μ½λ κ²½λ‘κ° μ€νλ μ§ μ μ΄ν¨μΌλ‘μ¨ λ¬μ±λ©λλ€. μ΄λ° λ°©μμΌλ‘ μ
°μ΄λ νλ‘κ·Έλ¨μ μ ννμ§ μκ³ λ λ€λ₯Έ μ¬μ§μ΄λ μκ° ν¨κ³Όλ₯Ό λ λλ§ν μ μμ΅λλ€.
κ°λ¨ν μλ‘ μ€λͺ ν΄ λ³΄κ² μ΅λλ€. κ°μ²΄λ₯Ό λλ°μ¬ μ‘°λͺ (diffuse lighting) λλ μ λ°μ¬ μ‘°λͺ (specular lighting)μΌλ‘ λ λλ§νκ³ μΆλ€κ³ κ°μ ν΄ λ΄ μλ€. λ κ°μ λ³λ μ °μ΄λ νλ‘κ·Έλ¨μ λ§λλ λμ , λ κ°μ§λ₯Ό λͺ¨λ μ§μνλ λ¨μΌ νλ‘κ·Έλ¨μ λ§λ€ μ μμ΅λλ€:
λ²ν μ€ μ °μ΄λ (곡ν΅):
#version 300 es
in vec4 a_position;
in vec3 a_normal;
uniform mat4 u_modelViewProjectionMatrix;
uniform mat4 u_modelViewMatrix;
uniform mat4 u_normalMatrix;
out vec3 v_normal;
out vec3 v_position;
void main() {
gl_Position = u_modelViewProjectionMatrix * a_position;
v_position = vec3(u_modelViewMatrix * a_position);
v_normal = normalize(vec3(u_normalMatrix * vec4(a_normal, 0.0)));
}
νλκ·Έλ¨ΌνΈ μ °μ΄λ (μ°λ² μ °μ΄λ):
#version 300 es
precision highp float;
in vec3 v_normal;
in vec3 v_position;
uniform vec3 u_lightDirection;
uniform vec3 u_diffuseColor;
uniform vec3 u_specularColor;
uniform float u_shininess;
uniform bool u_useSpecular;
out vec4 fragColor;
void main() {
vec3 normal = normalize(v_normal);
vec3 lightDir = normalize(u_lightDirection);
float diffuse = max(dot(normal, lightDir), 0.0);
vec3 diffuseColor = diffuse * u_diffuseColor;
vec3 specularColor = vec3(0.0);
if (u_useSpecular) {
vec3 viewDir = normalize(-v_position);
vec3 reflectDir = reflect(-lightDir, normal);
float specular = pow(max(dot(viewDir, reflectDir), 0.0), u_shininess);
specularColor = specular * u_specularColor;
}
fragColor = vec4(diffuseColor + specularColor, 1.0);
}
μ΄ μμ μμ u_useSpecular μ λνΌ λ³μλ μ λ°μ¬ μ‘°λͺ
νμ±ν μ¬λΆλ₯Ό μ μ΄ν©λλ€. u_useSpecularκ° trueλ‘ μ€μ λλ©΄ μ λ°μ¬ μ‘°λͺ
κ³μ°μ΄ μνλκ³ , κ·Έλ μ§ μμΌλ©΄ 건λλλλ€. μ¬λ°λ₯Έ μ λνΌμ μ€μ ν¨μΌλ‘μ¨ μ
°μ΄λ νλ‘κ·Έλ¨μ λ³κ²½νμ§ μκ³ λ λλ°μ¬ μ‘°λͺ
κ³Ό μ λ°μ¬ μ‘°λͺ
μ¬μ΄λ₯Ό ν¨κ³Όμ μΌλ‘ μ νν μ μμ΅λλ€.
λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬μ μ΄μ
- μ
°μ΄λ νλ‘κ·Έλ¨ μ ν κ°μ: μ£Όλ μ΄μ μ
gl.useProgram()νΈμΆ νμκ° μ€μ΄λ€μ΄, νΉν 볡μ‘ν μ₯λ©΄μ΄λ μ λλ©μ΄μ μ λ λλ§ν λ μ±λ₯μ΄ ν₯μλλ€λ κ²μ λλ€. - λ¨μνλ μν κ΄λ¦¬: λ μ μ μμ μ °μ΄λ νλ‘κ·Έλ¨μ μ¬μ©νλ©΄ μ ν리μΌμ΄μ μ μν κ΄λ¦¬λ₯Ό λ¨μνν μ μμ΅λλ€. μ¬λ¬ μ °μ΄λ νλ‘κ·Έλ¨κ³Ό κ΄λ ¨ μ λνΌμ μΆμ νλ λμ , λ¨μΌ μ°λ² μ °μ΄λ νλ‘κ·Έλ¨λ§ κ΄λ¦¬νλ©΄ λ©λλ€.
- μ½λ μ¬μ¬μ© κ°λ₯μ±: λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬λ μ °μ΄λ λ΄μμ μ½λ μ¬μ¬μ©μ μ₯λ €ν μ μμ΅λλ€. κ³΅ν΅ κ³μ°μ΄λ ν¨μλ₯Ό λ€λ₯Έ λ λλ§ λͺ¨λμμ 곡μ νμ¬ μ½λ μ€λ³΅μ μ€μ΄κ³ μ μ§λ³΄μμ±μ ν₯μμν¬ μ μμ΅λλ€.
λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬μ κ³Όμ
λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬λ μλΉν μ±λ₯ μ΄μ μ μ 곡ν μ μμ§λ§, λͺ κ°μ§ κ³Όμ λ μμ΅λλ€:
- μ °μ΄λ 볡μ‘μ± μ¦κ°: μ°λ² μ °μ΄λλ νΉν λ λλ§ λͺ¨λμ μκ° μ¦κ°ν¨μ λ°λΌ 볡μ‘ν΄μ§κ³ μ μ§ κ΄λ¦¬κ° μ΄λ €μμ§ μ μμ΅λλ€. μ‘°κ±΄λΆ λ‘μ§κ³Ό μ λνΌ λ³μ κ΄λ¦¬κ° κΈλ°© κ°λΉνκΈ° μ΄λ €μμ§ μ μμ΅λλ€.
- μ±λ₯ μ€λ²ν€λ: μ °μ΄λ λ΄μ 쑰건문μ GPUκ° μ€μ λ‘λ νμνμ§ μμ μ½λ κ²½λ‘λ₯Ό μ€νν΄μΌ ν μ μμΌλ―λ‘ μ±λ₯ μ€λ²ν€λλ₯Ό μ λ°ν μ μμ΅λλ€. μ °μ΄λ μ ν κ°μμ μ΄μ μ΄ μ‘°κ±΄λΆ μ€ν λΉμ©λ³΄λ€ ν°μ§ νμΈνκΈ° μν΄ μ °μ΄λλ₯Ό νλ‘νμΌλ§νλ κ²μ΄ μ€μν©λλ€. νλ GPUλ λΆκΈ° μμΈ‘μ λ₯μνμ¬ μ΄λ₯Ό μ΄λ μ λ μννμ§λ§, μ¬μ ν κ³ λ €νλ κ²μ΄ μ€μν©λλ€.
- μ °μ΄λ μ»΄νμΌ μκ°: ν¬κ³ 볡μ‘ν μ°λ² μ °μ΄λλ₯Ό μ»΄νμΌνλ κ²μ μ¬λ¬ κ°μ μμ μ °μ΄λλ₯Ό μ»΄νμΌνλ κ²λ³΄λ€ μ€λ 걸릴 μ μμ΅λλ€. μ΄λ μ ν리μΌμ΄μ μ μ΄κΈ° λ‘λ μκ°μ μν₯μ λ―ΈμΉ μ μμ΅λλ€.
- μ λνΌ μ ν: WebGL μ °μ΄λμμ μ¬μ©ν μ μλ μ λνΌ λ³μμ μμλ μ νμ΄ μμ΅λλ€. λ무 λ§μ κΈ°λ₯μ ν΅ν©νλ €λ μ°λ² μ °μ΄λλ μ΄ μ νμ μ΄κ³Όν μ μμ΅λλ€.
λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬λ₯Ό μν λͺ¨λ² μ¬λ‘
λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬λ₯Ό ν¨κ³Όμ μΌλ‘ μ¬μ©νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό κ³ λ €νμμμ€:
- μ °μ΄λ νλ‘νμΌλ§: λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬λ₯Ό ꡬννκΈ° μ μ κΈ°μ‘΄ μ °μ΄λλ₯Ό νλ‘νμΌλ§νμ¬ μ μ¬μ μΈ μ±λ₯ λ³λͺ© νμμ νμ νμμμ€. WebGL νλ‘νμΌλ§ λꡬλ₯Ό μ¬μ©νμ¬ μ °μ΄λ νλ‘κ·Έλ¨ μ ν λ° λ€λ₯Έ μ °μ΄λ μ½λ κ²½λ‘ μ€νμ μμλλ μκ°μ μΈ‘μ νμμμ€. μ΄λ λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬κ° μ ν리μΌμ΄μ μ μ ν©ν μ΅μ ν μ λ΅μΈμ§ νλ¨νλ λ° λμμ΄ λ κ²μ λλ€.
- μ °μ΄λ λͺ¨λν μ μ§: μ°λ² μ °μ΄λλ₯Ό μ¬μ©νλλΌλ λͺ¨λμ±μ μΆκ΅¬νμμμ€. μ °μ΄λ μ½λλ₯Ό λ μκ³ μ¬μ¬μ© κ°λ₯ν ν¨μλ‘ λλμμμ€. μ΄λ κ² νλ©΄ μ °μ΄λλ₯Ό λ μ½κ² μ΄ν΄νκ³ , μ μ§ κ΄λ¦¬νκ³ , λλ²κΉ ν μ μμ΅λλ€.
- μ λνΌ μ μ€νκ² μ¬μ©: μ°λ² μ °μ΄λμμ μ¬μ©λλ μ λνΌ λ³μμ μλ₯Ό μ΅μννμμμ€. κ΄λ ¨ μ λνΌ λ³μλ₯Ό κ΅¬μ‘°μ²΄λ‘ κ·Έλ£Ήννμ¬ μ 체 κ°μλ₯Ό μ€μ΄μμμ€. μ λνΌ λμ ν μ€μ² 룩μ μ μ¬μ©νμ¬ λλμ λ°μ΄ν°λ₯Ό μ μ₯νλ κ²μ κ³ λ €νμμμ€.
- μ‘°κ±΄λΆ λ‘μ§ μ΅μν: μ
°μ΄λ λ΄μ μ‘°κ±΄λΆ λ‘μ§ μμ μ€μ΄μμμ€. 볡μ‘ν
if/elseλ¬Έμ μμ‘΄νλ λμ μ λνΌ λ³μλ₯Ό μ¬μ©νμ¬ μ °μ΄λ λμμ μ μ΄νμμμ€. κ°λ₯νλ€λ©΄ JavaScriptμμ κ°μ 미리 κ³μ°νμ¬ μ λνΌμΌλ‘ μ °μ΄λμ μ λ¬νμμμ€. - μ °μ΄λ λ³ν κ³ λ €: κ²½μ°μ λ°λΌ λ¨μΌ μ°λ² μ °μ΄λ λμ μ¬λ¬ μ °μ΄λ λ³νμ λ§λλ κ²μ΄ λ ν¨μ¨μ μΌ μ μμ΅λλ€. μ °μ΄λ λ³νμ νΉμ λ λλ§ μλ리μ€μ μ΅μ νλ μ °μ΄λ νλ‘κ·Έλ¨μ νΉνλ λ²μ μ λλ€. μ΄ μ κ·Ό λ°©μμ μ °μ΄λμ 볡μ‘μ±μ μ€μ΄κ³ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€. μ μ²λ¦¬κΈ°λ₯Ό μ¬μ©νμ¬ λΉλ μμ λ³νμ μλμΌλ‘ μμ±νμ¬ μ½λλ₯Ό μ μ§ κ΄λ¦¬νμμμ€.
- #ifdefλ μ μ€νκ² μ¬μ©: #ifdefλ₯Ό μ¬μ©νμ¬ μ½λ μΌλΆλ₯Ό μ νν μ μμ§λ§, ifdef κ°μ΄ λ³κ²½λλ©΄ μ °μ΄λκ° λ€μ μ»΄νμΌλμ΄ μ±λ₯ λ¬Έμ κ° λ°μν©λλ€.
μ€μ μ¬λ‘
λͺλͺ μΈκΈ° μλ κ²μ μμ§κ³Ό κ·Έλν½ λΌμ΄λΈλ¬λ¦¬λ λ λλ§ μ±λ₯μ μ΅μ ννκΈ° μν΄ λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬ κΈ°μ μ μ¬μ©ν©λλ€. μλ₯Ό λ€μ΄:
- Unity: Unityμ νμ€ μ °μ΄λλ μ°λ² μ °μ΄λ μ κ·Ό λ°©μμ νμ©νμ¬ κ΄λ²μν μ¬μ§ μμ±κ³Ό μ‘°λͺ 쑰건μ μ²λ¦¬ν©λλ€. λ΄λΆμ μΌλ‘ ν€μλμ ν¨κ» μ °μ΄λ λ³νμ μ¬μ©ν©λλ€.
- Unreal Engine: μΈλ¦¬μΌ μμ§ λν μ°λ² μ °μ΄λμ μ °μ΄λ μμ΄μ μ¬μ©νμ¬ λ€μν μ¬μ§ λ³νκ³Ό λ λλ§ κΈ°λ₯μ κ΄λ¦¬ν©λλ€.
- Three.js: Three.jsκ° λͺ μμ μΌλ‘ λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬λ₯Ό κ°μ νμ§λ μμ§λ§, κ°λ°μκ° λ§μΆ€ν μ °μ΄λλ₯Ό λ§λ€κ³ λ λλ§ μ±λ₯μ μ΅μ νν μ μλ λꡬμ κΈ°μ μ μ 곡ν©λλ€. 컀μ€ν μ¬μ§κ³Ό shaderMaterialμ μ¬μ©νμ¬ κ°λ°μλ λΆνμν μ °μ΄λ μ νμ νΌνλ λ§μΆ€ν μ °μ΄λ νλ‘κ·Έλ¨μ λ§λ€ μ μμ΅λλ€.
μ΄λ¬ν μλ μ€μ μ ν리μΌμ΄μ μμ λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬μ μ€μ©μ±κ³Ό ν¨κ³Όλ₯Ό 보μ¬μ€λλ€. μ΄ κΈμμ μ€λͺ ν μμΉκ³Ό λͺ¨λ² μ¬λ‘λ₯Ό μ΄ν΄ν¨μΌλ‘μ¨, μ΄ κΈ°μ μ νμ©νμ¬ μμ μ WebGL νλ‘μ νΈλ₯Ό μ΅μ ννκ³ μκ°μ μΌλ‘ λλκ³ μ±λ₯μ΄ λ°μ΄λ κ²½νμ λ§λ€ μ μμ΅λλ€.
κ³ κΈ κΈ°μ
κΈ°λ³Έ μμΉμ λμ΄, λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬μ ν¨κ³Όλ₯Ό λμ± ν₯μμν¬ μ μλ λͺ κ°μ§ κ³ κΈ κΈ°μ μ΄ μμ΅λλ€:
μ °μ΄λ μ¬μ μ»΄νμΌ
μ °μ΄λλ₯Ό μ¬μ μ»΄νμΌνλ©΄ μ ν리μΌμ΄μ μ μ΄κΈ° λ‘λ μκ°μ ν¬κ² μ€μΌ μ μμ΅λλ€. λ°νμμ μ °μ΄λλ₯Ό μ»΄νμΌνλ λμ , μ€νλΌμΈμμ μ»΄νμΌνκ³ μ»΄νμΌλ λ°μ΄νΈμ½λλ₯Ό μ μ₯ν μ μμ΅λλ€. μ ν리μΌμ΄μ μ΄ μμλ λ μ¬μ μ»΄νμΌλ μ °μ΄λλ₯Ό μ§μ λ‘λνμ¬ μ»΄νμΌ μ€λ²ν€λλ₯Ό νΌν μ μμ΅λλ€.
μ °μ΄λ μΊμ±
μ °μ΄λ μΊμ±μ μ °μ΄λ μ»΄νμΌ νμλ₯Ό μ€μ΄λ λ° λμμ΄ λ μ μμ΅λλ€. μ °μ΄λκ° μ»΄νμΌλ λ μ»΄νμΌλ λ°μ΄νΈμ½λλ μΊμμ μ μ₯λ μ μμ΅λλ€. λμΌν μ °μ΄λκ° λ€μ νμν κ²½μ°, λ€μ μ»΄νμΌνλ λμ μΊμμμ κ²μν μ μμ΅λλ€.
GPU μΈμ€ν΄μ±
GPU μΈμ€ν΄μ±μ μ¬μ©νλ©΄ λ¨μΌ λλ‘μ° μ½λ‘ λμΌν κ°μ²΄μ μ¬λ¬ μΈμ€ν΄μ€λ₯Ό λ λλ§ν μ μμ΅λλ€. μ΄λ λλ‘μ° μ½ μλ₯Ό ν¬κ² μ€μ¬ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€. λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬λ GPU μΈμ€ν΄μ±κ³Ό κ²°ν©νμ¬ λ λλ§ μ±λ₯μ λμ± μ΅μ νν μ μμ΅λλ€.
μ§μ° μ °μ΄λ©
μ§μ° μ °μ΄λ©μ μ‘°λͺ κ³μ°μ μ§μ€λ©νΈλ¦¬ λ λλ§μμ λΆλ¦¬νλ λ λλ§ κΈ°μ μ λλ€. μ΄λ₯Ό ν΅ν΄ μ₯λ©΄μ μ‘°λͺ μμ μ νλ°μ§ μκ³ λ³΅μ‘ν μ‘°λͺ κ³μ°μ μνν μ μμ΅λλ€. λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬λ μ§μ° μ °μ΄λ© νμ΄νλΌμΈμ μ΅μ ννλ λ° μ¬μ©λ μ μμ΅λλ€.
κ²°λ‘
WebGL μ °μ΄λ νλ‘κ·Έλ¨ λ§ν¬λ μΉμμ 3D κ·Έλν½μ λ§λλ κ·Όλ³Έμ μΈ μΈ‘λ©΄μ λλ€. μ °μ΄λκ° μ΄λ»κ² μμ±, μ»΄νμΌ, λ§ν¬λλμ§ μ΄ν΄νλ κ²μ λ λλ§ μ±λ₯μ μ΅μ ννκ³ λ³΅μ‘ν μκ° ν¨κ³Όλ₯Ό λ§λλ λ° λ§€μ° μ€μν©λλ€. λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬λ μ °μ΄λ νλ‘κ·Έλ¨ μ ν νμλ₯Ό μ€μ¬ μ±λ₯ ν₯μκ³Ό μν κ΄λ¦¬ λ¨μνλ₯Ό μ΄λμ΄λΌ μ μλ κ°λ ₯ν κΈ°λ²μ λλ€. μ΄ κΈμμ μ€λͺ ν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄κ³ κ³Όμ λ₯Ό κ³ λ €ν¨μΌλ‘μ¨, λ€μ€ μ °μ΄λ νλ‘κ·Έλ¨ μ΄μ λΈλ¦¬λ₯Ό ν¨κ³Όμ μΌλ‘ νμ©νμ¬ μ μΈκ³ μ¬μ©μλ₯Ό μν μκ°μ μΌλ‘ λλκ³ μ±λ₯μ΄ λ°μ΄λ WebGL μ ν리μΌμ΄μ μ λ§λ€ μ μμ΅λλ€.
μ΅μμ μ κ·Ό λ°©μμ μ ν리μΌμ΄μ μ νΉμ μꡬ μ¬νμ λ°λΌ λ¬λΌμ§λ€λ μ μ κΈ°μ΅νμμμ€. μ½λλ₯Ό νλ‘νμΌλ§νκ³ , λ€μν κΈ°μ μ μ€ννλ©°, νμ μ±λ₯κ³Ό μ½λ μ μ§λ³΄μμ± μ¬μ΄μ κ· νμ λ§μΆκΈ° μν΄ λ Έλ ₯νμμμ€.